package com.knowledge.plus.泛型.类型擦除;

import java.util.ArrayList;

/**
 * 类型擦除 demo1
 * <p>
 * 什么是类型擦除：
 * 泛型的本质是将数据类型参数化，它通过擦除的方式来实现，即编译器会在编译期间擦除代码中的所有泛型语法并相应的做出一些类型转换动作。
 * <p>
 * 换而言之，泛型信息只存在于代码编译阶段，在代码编译结束后，与泛型相关的信息会被擦除掉，专业术语叫做类型擦除。
 * 也就是说，成功编译过后的 class 文件中不包含任何泛型信息，泛型信息不会进入到运行时阶段。
 *
 * @author aFei
 * @since 2023/10/30
 */
class Demo1 {

    /*
     * 我们定义了两个 ArrayList 集合，
     * 一个是 ArrayList<String>，只能存储字符串。一个是 ArrayList<Integer>，只能存储整型对象。
     * 我们通过 arrayString 对象和 arrayInteger 对象的 getClass() 方法获取它们的类信息并比较，发现结果为true。
     */
    public static void main(String[] args) {
        ArrayList<String> arrayString = new ArrayList<>();
        arrayString.add("");

        ArrayList<Integer> arrayInteger = new ArrayList<>();
        arrayInteger.add(1);

        // 打印结果：true
        System.out.println(arrayString.getClass() == arrayInteger.getClass());
    }

    /*
     * 明明我们在 <> 中传入了两种不同的数据类型，按照上文所说的，它们的类型参数 T 不是应该被替换成我们传入的数据类型了吗？
     *
     * 那为什么它们的类信息还是相同呢？
     * 这是因为，在编译期间，所有的泛型信息都会被擦除，
     * ArrayList<Integer> 和 ArrayList<String> 类型，在编译后都会变成 ArrayList<Object> 类型
     */

}
